﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace TestImport.Model.DatabaseRepositories
{
    public abstract partial class DatabaseRepository
    {
        /****************/
        /* LeerlingBoek */
        /****************/

        public DataTable LeerlingBoek_GetData()
        {
            return defaultExecuteReaderDataTable(CommandType.Text, "SELECT leerlingBoekID, boekID, leerlingID, datumBestelling, datumAfhaling, datumAnnulatie, datumRetour, rekeningID, rekeningRetourID, boeklijstItemID, status FROM LeerlingBoek");
        }

        public DataTable LeerlingBoek_GetDataByLeerlingID(int leerlingID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(1);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT leerlingBoekID, boekID, leerlingID, datumBestelling, datumAfhaling, datumAnnulatie, datumRetour, rekeningID, rekeningRetourID, boeklijstItemID, status FROM LeerlingBoek WHERE (leerlingID = @leerlingID)");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }
        
        public DataTable LeerlingBoek_GetDataByLeerlingIDenBoekID(int leerlingID, int boekID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.AddParameters(1, "@boekID", boekID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT leerlingBoekID, boekID, leerlingID, datumBestelling, datumAfhaling, datumAnnulatie, datumRetour, rekeningID, rekeningRetourID, boeklijstItemID, status FROM LeerlingBoek WHERE (leerlingID = @leerlingID) AND (boekID = @boekID)");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public DataTable LeerlingBoek_GetByTeFacturerenBoeken(int leerlingID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(1);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT leerlingBoekID, boekID, leerlingID, datumBestelling, datumAfhaling, datumAnnulatie, datumRetour, rekeningID, rekeningRetourID, boeklijstItemID, status FROM LeerlingBoek WHERE (rekeningID IS NULL) AND (leerlingID = @leerlingID)");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public DataTable LeerlingBoek_GetRekeningForLeerlingBoek(int leerlingID, int boekID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.AddParameters(1, "@boekID", boekID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT rekeningID, datumBestelling, datumAfhaling, datumAnnulatie, datumRetour, rekeningRetourID, boeklijstItemID, status, boekID, leerlingID, leerlingBoekID FROM LeerlingBoek WHERE (leerlingID = @leerlingID) AND (boekID = @boekID)");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public int LeerlingBoek_InsertViaAfhaling(int boekID, int leerlingID, DateTime datumAfhaling, int rekeningID, int boeklijstItemID, int status)
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(6);
                dbManager.AddParameters(0, "@boekID", boekID);
                dbManager.AddParameters(1, "@leerlingID", leerlingID);
                dbManager.AddParameters(2, "@datumAfhaling", datumAfhaling);
                dbManager.AddParameters(3, "@rekeningID", rekeningID);
                dbManager.AddParameters(4, "@boeklijstItemID", boeklijstItemID);
                dbManager.AddParameters(5, "@status", status);
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "INSERT INTO LeerlingBoek (boekID, leerlingID, datumAfhaling, rekeningID, boeklijstItemID, status) VALUES (@boekID, @leerlingID, @datumAfhaling, @rekeningID, @boeklijstItemID, @status)").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public int LeerlingBoek_InsertViaRekening(int boekID, int leerlingID, int rekeningID, int boeklijstItemID, int status)
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(5);
                dbManager.AddParameters(0, "@boekID", boekID);
                dbManager.AddParameters(1, "@leerlingID", leerlingID);
                dbManager.AddParameters(2, "@rekeningID", rekeningID);
                dbManager.AddParameters(3, "@boeklijstItemID", boeklijstItemID);
                dbManager.AddParameters(4, "@status", status);
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "INSERT INTO LeerlingBoek (boekID, leerlingID, rekeningID, boeklijstItemID, status) VALUES (@boekID, @leerlingID, @rekeningID, @boeklijstItemID, @status)").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public int LeerlingBoek_Insert(int boekID, int leerlingID, DateTime datumBestelling, int boeklijstItemID, int status)
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(5);
                dbManager.AddParameters(0, "@boekID", boekID);
                dbManager.AddParameters(1, "@leerlingID", leerlingID);
                dbManager.AddParameters(2, "@datumBestelling", datumBestelling);
                dbManager.AddParameters(3, "@boeklijstItemID", boeklijstItemID);
                dbManager.AddParameters(4, "@status", status);
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "INSERT INTO LeerlingBoek (boekID, leerlingID, datumBestelling, boeklijstItemID, status) VALUES (@boekID, @leerlingID, @datumBestelling, @boeklijstItemID, @status)").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public void LeerlingBoek_UpdateDatumAfhaling(DateTime datumAfhaling, int leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@datumAfhaling", datumAfhaling);
                dbManager.AddParameters(1, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET datumAfhaling = @datumAfhaling, status = 2 WHERE (leerlingBoekID = @leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateDatumBestelling(DateTime datumBestelling, int leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@datumBestelling", datumBestelling);
                dbManager.AddParameters(1, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET datumBestelling = @datumBestelling, status = 0 WHERE (leerlingBoekID = @leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateDatumRetour(DateTime datumRetour, int leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@datumRetour", datumRetour);
                dbManager.AddParameters(1, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET datumRetour = @datumRetour, status = 3 WHERE (leerlingBoekID = @leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateRekeningRetourIdViaRekening(int rekeningID, int leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@rekeningID", rekeningID);
                dbManager.AddParameters(1, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET rekeningRetourID = @rekeningID WHERE (leerlingBoekID = @leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateViaAfhalingMetRekening(DateTime datumAfhaling, int rekeningID, bool status, int origineel_leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(4);
                dbManager.AddParameters(0, "@datumAfhaling", datumAfhaling);
                dbManager.AddParameters(1, "@rekeningID", rekeningID);
                dbManager.AddParameters(2, "@status", status);
                dbManager.AddParameters(3, "@Original_leerlingBoekID", origineel_leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET datumAfhaling = @datumAfhaling, rekeningID = @rekeningID, status = @status WHERE (leerlingBoekID = @Original_leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateViaAfhalingZonderRekening(DateTime datumAfhaling, bool status, int origineel_leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(3);
                dbManager.AddParameters(0, "@datumAfhaling", datumAfhaling);
                dbManager.AddParameters(1, "@status", status);
                dbManager.AddParameters(2, "@Original_leerlingBoekID", origineel_leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET datumAfhaling = @datumAfhaling, status = @status WHERE (leerlingBoekID = @Original_leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateViaAnnulatieMetRekening(DateTime datumAfhaling, DateTime datumAnnulatie, int rekeningID, bool status, int origineel_leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(5);
                dbManager.AddParameters(0, "@datumAfhaling", datumAfhaling);
                dbManager.AddParameters(1, "@datumAnnulatie", datumAnnulatie);
                dbManager.AddParameters(2, "@rekeningID", rekeningID);
                dbManager.AddParameters(3, "@status", status);
                dbManager.AddParameters(4, "@Original_leerlingBoekID", origineel_leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET datumAfhaling = @datumAfhaling, datumAnnulatie = @datumAnnulatie, rekeningID = @rekeningID, status = @status WHERE (leerlingBoekID = @Original_leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public void LeerlingBoek_UpdateViaRekening(int rekeningID, int leerlingBoekID)
        {
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(8);
                dbManager.AddParameters(0, "@rekeningID", rekeningID);
                dbManager.AddParameters(1, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE LeerlingBoek SET rekeningID = @rekeningID WHERE (leerlingBoekID = @leerlingBoekID)");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
        }

        public int LeerlingBoek_UpdateRekeningIdToNull()
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE Leerling SET rekeningID = NULL").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public int LeerlingBoek_UpdateRekeningRetourIdToNull()
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "UPDATE Leerling SET rekeningRetourID = NULL").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public int LeerlingBoek_DeleteByLeerlingID(int leerlingID, int status)
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.AddParameters(1, "@status", status);
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "DELETE FROM LeerlingBoek WHERE leerlingID = @leerlingID AND status = @status").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public int LeerlingBoek_DeleteByLeerlingBoekID(int leerlingBoekID, int status)
        {
            int aantal = 0;
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@leerlingBoekID", leerlingBoekID);
                dbManager.AddParameters(1, "@status", status);
                aantal = Int32.Parse(dbManager.ExecuteNonQuery(CommandType.Text, "DELETE FROM LeerlingBoek WHERE leerlingBoekID = @leerlingBoekID AND status = @status").ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return aantal;
        }

        public DataTable LeerlingBoek_GetStatusBestelling(int leerlingBoekID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(1);
                dbManager.AddParameters(0, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT status FROM LeerlingBoek WHERE leerlingBoekID = @leerlingBoekID");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public DataTable LeerlingBoek_ZoekLeerlingBoek(int leerlingID, int boekID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(2);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.AddParameters(1, "@boekID", boekID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT leerlingBoekID FROM LeerlingBoek WHERE leerlingID = @leerlingID AND boekID = @boekID");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public DataTable LeerlingBoek_ZoekLeerlingBoekBis(int leerlingBoekID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(1);
                dbManager.AddParameters(0, "@leerlingBoekID", leerlingBoekID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT leerlingBoekID FROM LeerlingBoek WHERE leerlingBoekID = @leerlingBoekID");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public DataTable LeerlingBoek_GetBesteldeBoeken(int leerlingID)
        {
            DataTable dt = new DataTable();
            try
            {
                dbManager.Open();
                dbManager.CreateParameters(1);
                dbManager.AddParameters(0, "@leerlingID", leerlingID);
                dbManager.ExecuteReader(CommandType.Text, "SELECT DISTINCT b.titel AS titel, bl.categorieCode AS categorieCode, bl.boeksoortCode AS boeksoortCode " +
                  "FROM (LeerlingBoek AS lb INNER JOIN Boek AS b ON lb.boekID = b.BoekID) " +
                  "INNER JOIN BoeklijstItem AS bl ON bl.boeklijstItemID = lb.boeklijstItemID " +
                  "WHERE lb.leerlingID = @leerlingID " +
                  "ORDER BY bl.categorieCode");
                dt.Load(dbManager.DataReader);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return dt;
        }

        public bool LeerlingBoek_Truncate()
        {
            bool succeed = false;
            try
            {
                dbManager.Open();
                dbManager.ExecuteNonQuery(CommandType.Text, "TRUNCATE TABLE LeerlingBoek");
                succeed = true;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                dbManager.Dispose();
            }
            return succeed;
        }

    }
}
